#include "src/ltio.h"

#include <stdio.h>

#include "src/ltbase.h"
#include "src/lterr.h"

lt_UsingType(lt, I32);
lt_UsingType(ltio, Rune);
lt_UsingType(ltio, CharStream);

Rune
ltio_GetChar(FILE* fp) {
    I32 c = fgetc(fp);
    if (c == EOF) {
        if (ferror(fp))
            return -lterr_kFileError;
        return -lterr_kEnd;
    }
    return c;
}

Rune
ltio_FilePtrReadChar(void* ctx) {
    return ltio_GetChar((FILE*)ctx);
}

Rune
ltio_CharStreamReadChar(void* ctx) {
    CharStream* stream = (CharStream*)ctx;
    if (stream->now >= stream->len)
        return -lterr_kEnd;
    I32 c = (unsigned char)stream->data[stream->len];
    stream->len += 1;
    return c;
}
